/**
 * @addtogroup hj1239_frame
 * hj1239_frame
 * @{
 */
/**
 * @file        hj1239_frame.h
 * @brief       提供常用的功能函数
 * @note        XXXX
 * @author      靳普诏(puzhao.jin@hopechart.com)
 * @date        2023/10/18
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2023/10/18   <td>1.0         <td>靳普诏       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_HJ1239_FRAME_H_
#define _BSC_HJ1239_FRAME_H_

#include "ofc/ofc_types.h"
#include "bsc_hj1239/bsc_hj1239_channel.h"
#include "bsc_hj1239/bsc_hj1239_common.h"
#include "gbmsg17691/gbc_17691_encrypt_interface.h"

#ifdef __cplusplus
extern "C"
{
#endif


typedef struct TBsHj1239FrameParamTag TBsHj1239FrameParam;
struct TBsHj1239FrameParamTag
{
    IBsHj1239FwParam *fw_param_if;  
    IGbc17691Encrypt   *encrypt_if;

    TBsHj1239Channel  *channel_list;
    UInt8           channel_cnt;
};


/**
 * 初始化Hj1239框架单实例对象. 仅需要初始化一次
 * @param *param    初始化参数
 * @return >= 0     成功
 *         <  0     失败
 */
Int32 BsHj1239FrameInit(TBsHj1239FrameParam *param);

/**
 * 反初始化Hj1239框架单实例对象
 * @return 
 */
void BsHj1239FrameDone(void);

/**
 * Hj1239框架任务执行
 * @return 
 */
void BsHj1239FrameRunOnce(void);



/**
 * 读取数据
 * @param *self         对象指针
 * @param id            参数id
 * @param *r_data       读取数据缓存地址
 * @param r_data_size   读取数据缓存大小
 * @return >= 0 成功读取数据大小
 *         < 0  失败 
 */
Int32 BsHj1239FwParamRead(TBsHj1239FwParamId id, void *r_data, UInt32 r_data_size);


/**
 * 写入数据
 * @param *self         对象指针
 * @param id            参数id
 * @param *i_data       写入数据地址
 * @param i_data_size   写入数据大小
 * @return >= 0 成功写入数据大小
 *         < 0  失败
 */
Int32 BsHj1239FwParamWrite(TBsHj1239FwParamId id, const void *i_data, UInt32 i_data_size);


/**
 * 获取当前时间。
 * @param *valid    返回是否有效. NULL表示不关心
 * @return UTC8时间戳
 */
UInt32 BsHj1239GetUtc8(Bool *valid);


/**
 * 时间戳转换
 * @param time      utc时间戳 
 * @param *buf      数据缓存地址
 * @param buf_len   数据缓存大小
 * @return >= 0 成功,数据长度
 *         < 0  失败 
 */
Int32 BsHj1239TransDateTime(TTime ticks, UInt8 *buf, UInt8 buf_len);


/**
 * 时间戳比较
 * @param time1 时间1
 * @param time2 时间2
 * @return True  Time1 > Time2
 *         False Time1 <= Time2
 */
Bool BsHj1239Time1IsAfterTime2(UInt8 time1[6], UInt8 time2[6]);




/**
 * 获取芯片ID
 * @param sender: 对象指针
 * @param buf: 存放芯片ID的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的芯片ID的长度，负数为错误码
 */
Int32 BsHj1239EncryptChipId(UInt8 *buf, UInt16 buf_len);

/**
 * 获取加密公钥
 * @param sender: 对象指针
 * @param buf: 存放公钥的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的公钥的长度，负数为错误码
 */
Int32 BsHj1239EncryptPublicKey(UInt8 *buf, UInt16 buf_len);

/**
 * 获取签名值接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待签名内容
 * @param content_len: 待签名内容长度
 * @param signature: 加密后的数字签名
 * @return 获得签名数据的长度，负数为错误码
 */
Int32 BsHj1239EncryptSignature(UInt8 encrypt_type, UInt8 *content, UInt16 content_len, TGbc17691Signature *signature);

/**
 * 加密接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待加密内容
 * @param content_len: 待加密内容长度
 * @param cipher: 加密缓存
 * @param cipher_len: 加密缓存长度
 * @return 获得加密数据的长度，<=0 表示异常
 */
Int32 BsHj1239EncryptData(UInt8 encrypt_type, UInt8 *msg, UInt16 msg_len, UInt8 *cipher, UInt16 cipher_len);




/*--------------------------------*/

/**
 * 获取通道对象指针
 * @param channel   通道号
 * @return 通道对象指针
 */
TBsHj1239Channel *BsHj1239FrameChannelHandle(UInt8 channel);

/**
 * 通道会话状态查询
 * @param channel 通道号
 * @return >= 0 成功, @ref TBsHj1239ChlSessionStateEnum
 *         < 0  失败
 */
Int32 BsHj1239FrameSessionState(UInt8 channel);


/**
 * 通道会话连接使能控制
 * @param channel 通道号
 * @param allow True 使能连接；False 失能连接。默认为 True
 * @return >= 0 设置成功
 *         < 0  设置失败
 */
Int32 BsHj1239FrameSetSessionConnectAllowed(UInt8 channel, Bool allow);


/**
 * 通道重启。
 * @note 当关键参数做修改后需要重启通道。例如，vin码、加密芯片id
 * @param channel 通道号
 * @return 
 */
Int32 BsHj1239FrameReconnect(UInt8 channel);

/**
 * 查看平台登入状态
 * @param channel 通道号
 * @return True     登入完成
 *         False    未登入
 */
Bool BsHj1239FrameIsLogin(UInt8 channel);


/**
 * 备案激活动作单次触发
 * @param channel 通道号
 * @return >= 0 成功
 *         <  0 失败
 */
Int32 BsHj1239FrameTiggerRecordReport(UInt8 channel);

/**
 * 防拆报警上报单次触发
 * @param channel 通道号
 * @return >= 0 成功
 *         <  0 失败
 */
Int32 BsHj1239FrameTiggerAlarmReport(UInt8 channel);

/**
 * Obd数据上报单次触发
 * @param channel 通道号
 * @return >= 0 成功
 *         <  0 失败
 */
Int32 BsHj1239FrameTiggerObdDataReport(UInt8 channel);


/**
 * 自定义数据包直接发送
 * @param channel 通道号
 * @param *msg  自定义数据
 * @return >= 0 成功，发送的字节大小
 *         <  0 失败
 */
Int32 BsHj1239FrameSendMsg(UInt8 channel, TGbc17691MsgHead *msg);



#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _BSC_HJ1239_FRAME_H_

/**
 * @}  Generated on "2023-10-18 17:23:18" by the tool "gen_hq_file.py >> V20230509_1" 
 */
